package annotation;

import bean.Phone;
import org.junit.Test;

import java.util.Calendar;
import java.util.Date;

/**
 * 注解是从jdk5.0开始引入，以 @注解名 在代码中存在
 * <p>
 * Annotation可以像修饰符一样被使用，可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。
 * 还可以添加一些参数值，这些信息被保存在Annotation的"name = value"对中。
 * <p>
 * 注解可以在编译、运行时进行加载，体现不同的功能。
 * <p>
 * -@Override: 限定重写父类方法，该注解只能用于方法
 * -@Deprecated: 用于表示所修饰的元素(类 、 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择。
 * -@SuppressWarnings： 抑制编译器警告
 * <p>
 * 自定义注解：以 @SuppressWarnings为参照，进行定义即可
 * <p>
 * 框架 = 注解 + 反射 + 设计模式
 * <p>
 * 元注解：对现有的注解进行解释说明的注解。
 * 1. @Target:用于描述注解的使用范围。可以通过枚举类型ElementType的10个常量对象来指定
 * 2. @Retention：用于描述注解的生命周期。可以通过枚举类型RetationPolicy的3个常量对象来指定
 * ---SOURCE(源代码)/CLASS(字节码)/RUNTIME(运行时)
 * ---唯有RUNTIME阶段才能被反射读取到。
 * 3. @Documented：表明这个注解应该被 javadoc 工具记录。
 * 4. @Inherited：允许子类继承父类中的注解
 */
@SuppressWarnings({"unused"})
@MyAnnotation(value = "class")
public class AnnotationTest {

    @Test
    public void testAnnotation() {
        Date date1 = new Date();
        System.out.println(date1);

        @MyAnnotation
        Date date2 = new Date(2025, Calendar.FEBRUARY, 23);
        System.out.println(date2);

        Phone p = new Phone(1299);
    }
}
